package demo.jna;

import com.alibaba.fastjson.JSON;
import org.junit.Test;
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.GlobalMemory;
import oshi.hardware.HardwareAbstractionLayer;
import oshi.software.os.OperatingSystem;

import java.util.Properties;

/**
 * OSHI是Java的免费基于JNA的（本机）操作系统和硬件信息库。它不需要安装任何其他本机库，并且旨在提供一种跨平台的实现来检索系统信息，例如操作系统版本，进程，内存和CPU使用率，磁盘和分区，设备，传感器等。
 * <p>
 * <p>
 * <p>
 * 使用OSHI我们可以对应用程序进行监控，可以对应用程序所在的服务器资源进行监控，可以监控到很多的指标，如下：
 *
 * <li>1、计算机系统和固件，底板
 * <li>2、操作系统和版本/内部版本
 * <li>3、物理（核心）和逻辑（超线程）CPU，处理器组，NUMA节点
 * <li>4、系统和每个处理器的负载百分比和滴答计数器
 * <li>5、CPU正常运行时间，进程和线程
 * <li>6、进程正常运行时间，CPU，内存使用率，用户/组，命令行
 * <li>7、已使用/可用的物理和虚拟内存
 * <li>8、挂载的文件系统（类型，可用空间和总空间）
 * <li>9、磁盘驱动器（型号，序列号，大小）和分区
 * <li>10、网络接口（IP，带宽输入/输出）
 * <li>11、电池状态（电量百分比，剩余时间，电量使用情况统计信息）
 * <li>12、连接的显示器（带有EDID信息）
 * <li>13、USB设备
 * <li>14、传感器（温度，风扇速度，电压）
 */
public class OshiDemo {

    @Test
    public void testSystemInfo() {
        SystemInfo systemInfo = new SystemInfo();
        HardwareAbstractionLayer hardware = systemInfo.getHardware();

        System.out.println("------Memory------");
        GlobalMemory memory = hardware.getMemory();
        System.out.println(JSON.toJSONString(memory, true));

        CentralProcessor cpu = hardware.getProcessor();
        System.out.println("------CPU------");
        System.out.println(JSON.toJSONString(cpu, true));

        OperatingSystem os = systemInfo.getOperatingSystem();
    }

    /**
     * 设置服务器信息
     */
    private void setSysInfo() {
        Properties props = System.getProperties();
//        sys.setComputerName(IpUtil.getHostName());
//        sys.setComputerIp(NetUtil.getLocalhostStr());
//        sys.setOsName(props.getProperty("os.name"));
//        sys.setOsArch(props.getProperty("os.arch"));
//        sys.setUserDir(props.getProperty("user.dir"));
    }
}
